// Person.h
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
    Person() {}
    ~Person() {}
public:     // 基类 public 属性数据成员
    float height;
protected:  // 基类 protected 属性数据成员
    string name;
private:    // 基类 private 属性数据成员
    int age;
};

class Student : public Person // 公有继承
{
public:
    Student() {
        // 验证公有继承方式
        // 派生类中可以访问基类公有成员和保护成员可以访问，私有成员不可访问
        // 派生类中
        height = 175;
        name = "lanqiao";
        // age = 18;
    }
    ~Student() {}
};

class Teacher : protected Person
{
public:
    Teacher() {
        // 验证保护继承方式
        // 派生类中可以访问基类公有成员和保护成员可以访问，私有成员不可访问
        height = 175;
        name = "lanqiao";
        // age = 18;
    }
    ~Teacher() {}
};

class Worker : private Person
{
public:
    Worker() {
        // 验证私有继承方式
        // 派生类中可以访问基类公有成员和保护成员可以访问，私有成员不可访问
        height = 175;
        name = "lanqiao";
        // age = 18;
    }
    ~Worker() {}
};

class Programer : private Worker
{
public:
    Programer() {
        // 验证私有继承方式
        // 派生类中可以访问基类公有成员和保护成员可以访问，私有成员不可访问
        // height = 175;
        // name = "lanqiao";
        // age = 18;
    }
    ~Programer() {}
};



int main()
{
    /* 公有继承：
        基类中公有成员在派生类中仍然是公有成员
        基类中保护成员在派生类中仍然是保护成员
        基类中私有成员在派生类中仍然是私有成员
    */
    Student stu;
    stu.height = 180;
    // stu.name = "hello";
    // stu.age = 19;

    /* 保护继承：
        基类中公有成员在派生类中变成了保护成员
        基类中保护成员在派生类中仍然是保护成员
        基类中私有成员在派生类中仍然是私有成员
    */
    Teacher tea;
    // tea.height = 180;
    // tea.name = "hello";
    // tea.age = 19;

    /* 私有继承：
        基类中公有成员在派生类中变成了私有成员
        基类中保护成员在派生类中仍然是私有成员
        基类中私有成员在派生类中仍然是私有成员
    */
    Worker w;
    // w.height = 180;
    // w.name = "hello";
    // w.age = 19;

    return 0;
}